package com.atguigu.gmall.product.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.model.product.*;
import com.atguigu.gmall.product.service.api.ManagerService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author: 封捷
 * @create-date: 2022/8/19 10:20
 */
@Api(tags = "商品属性接口")
@RestController
@RequestMapping("/admin/product")

// 局部解决跨域问题，哪个Controller需要，哪个加注解
// @CrossOrigin
public class BaseManagerController {

    @Autowired
    private ManagerService managerService;

    @GetMapping("/getCategory1")
    public Result<List<BaseCategory1>> getCategory1() {
        Result<List<BaseCategory1>> result = null;

        try {
            // 调用 Service 方法获取数据
            List<BaseCategory1> baseCategory1List = managerService.getCategory1List();

            // 把查询到的数据封装到 Result 对象中
            result = Result.ok(baseCategory1List);
        } catch (Exception e) {
            e.printStackTrace();

            // 保证即使在抛异常的情况下，数据的接收端也仍然能够接收到 Result 类型
            // 进而通过 Result 类型中封装的 code 判断服务器端操作是否成功
            result = Result.fail();

            result.message(e.getMessage());
        }

        // 返回封装结果
        return result;
    }

    @GetMapping("/getCategory2/{category1Id}")
    public Result<List<BaseCategory2>> getCategory2(
            // 获取路径中的参数：一级分类的 id
            @PathVariable("category1Id") Integer category1Id) {

        Result<List<BaseCategory2>> result = null;

        try {
            // 核心操作：根据一级分类 id，查询二级分类列表
            List<BaseCategory2> baseCategory2List = managerService.getCategory2List(category1Id);

            result = Result.ok(baseCategory2List);
        } catch (Exception e) {
            e.printStackTrace();

            result = Result.fail();

            result.message(e.getMessage());
        }

        return result;
    }

    @GetMapping("/getCategory3/{category2Id}")
    public Result<List<BaseCategory3>> getCategory3(
            @PathVariable("category2Id") Integer category2Id) {

        Result<List<BaseCategory3>> result = null;

        try {
            List<BaseCategory3> baseCategory3List = managerService.getCategory3List(category2Id);

            result = Result.ok(baseCategory3List);
        } catch (Exception e) {
            e.printStackTrace();

            result = Result.fail();

            result.message(e.getMessage());
        }

        return result;
    }

    @GetMapping("/attrInfoList/{category1Id}/{category2Id}/{category3Id}")
    public Result<List<BaseAttrInfo>> getBaseAttrInfoList(
            @PathVariable("category1Id") Long category1Id,
            @PathVariable("category2Id") Long category2Id,
            @PathVariable("category3Id") Long category3Id
    ) {

        List<BaseAttrInfo> baseAttrInfoList = managerService.getBaseAttrInfo(category1Id, category2Id, category3Id);

        return Result.ok(baseAttrInfoList);
    }

    @PostMapping("/saveAttrInfo")
    public Result<Void> saveAttrInfo(
            // @RequestBody：接收请求体发送过来的 JSON 数据
            @RequestBody BaseAttrInfo baseAttrInfo) {

        managerService.saveBaseAttrInfo(baseAttrInfo);

        return Result.ok();
    }

    @GetMapping("/getAttrValueList/{attrId}")
    public Result<List<BaseAttrValue>> getAttrValueList(
            // 接收路径中的参数
            @PathVariable Long attrId) {

        // 调用业务方法查询数据
        List<BaseAttrValue> baseAttrValueList = managerService.getAttrValueList(attrId);

        // 返回结果
        return Result.ok(baseAttrValueList);
    }

    // 参数传入的方式不同，获取方式也必须对应
    // /{page}/{limit}?category3Id=61
    @GetMapping("/{page}/{limit}")
    public Result<IPage<SpuInfo>> getSpuInfoPage(
            @PathVariable("page") Long page,
            @PathVariable("limit") Long limit,
            @RequestParam("category3Id") Long category3Id
    ) {

        // 调用 Service 方法查询分页数据
        IPage<SpuInfo> pageInfo = managerService.getSpuInfoPage(page, limit, category3Id);

        // 封装到 Result 返回
        return Result.ok(pageInfo);
    }

}
